package com.chiffoyqc.nbiot;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

/**
 * Created by Administrator on 2018/1/11.
 */
public class CmdProcess {

    private String identifier = "HKC";
    private String msgType = "deviceReq";
    private String serviceId = "Temperate";
    private String cmd = "SET_TEMPERATE";
    private int hasMore = 0;
    private int errcode = 0;
    private int hasMid = 0x00;//0表示没有 1表示有
    private int mid = 0;
    private JsonNode paras;


    public CmdProcess() {
    }

    /**
     * 表3-4 平台下发命令encode接口的入参结构定义
     * {
     * "identifier": "123",
     * "msgType": "cloudReq",
     * "serviceId": "NBWaterMeterCommon",
     * "mid": 2016,
     * "cmd": "SET_TEMPERATURE_READ_PERIOD",
     * "paras": {
     * "value": 4
     * },
     * "hasMore": 0}
     * }
     * <p>
     * 表3-5 平台收到设备的上报数据后对设备的应答encode接口的入参结构定义
     * {
     * "identifier": "123",
     * "msgType": "cloudRsp",
     * "request": [
     * 1,
     * 2
     * ],
     * "errcode": 0,
     * "hasMore": 0
     * }
     */
    public CmdProcess(ObjectNode input) {

        try {
            if (input != null) {
                this.identifier = input.get("identifier").asText();
                this.msgType = input.get("msgType").asText();

                /**
                 * 平台收到设备上报消息以后，编码ACK对设备进行响应
                 * */
                if (msgType.equals("cloudRsp")) {
                    this.errcode = input.get("errcode").asInt();
                    this.hasMore = input.get("hasMore").asInt();
                } else if (msgType.equals("cloudReq")) {
                    /**
                     * 命令下发
                     * {
                     "identifier":0,
                     "msgType":"cloudReq",
                     "serviceId":"NBWaterMeterCommon",
                     "mid":2016,
                     "cmd":"SET_TEMPERATURE_READ_PERIOD",
                     "paras":{"value":4},
                     "hasMore":0
                     }
                     * */
                    //此处需要考虑兼容性，如果没有传mId，则不对其进行编码
                    if (input.get("mid") != null) {
                        this.mid = input.get("mid").asInt();
                        this.hasMid = 0x01;
                    }
                    this.cmd = input.get("cmd").asText();
                    this.paras = input.get("paras");
                    this.hasMore = input.get("hasMore").asInt();
                }
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public byte[] toByte() {
        try {

            /**
             * 平台对设备下发命令
             * */

            if (this.msgType.equalsIgnoreCase("cloudReq")) {
                /*
                	应用服务器下发的控制命令，本例只有一条控制命令：SET_TEMPERATE
                	如果有其他控制命令，增加判断即可。
                	数据3： AA 72 01 00 01 1616 23 设置温度为35度
                * */
                if (this.cmd.equals("SEND_COMMAND")) {
                    String commandStr = paras.get("commandStr").asText();
                    short[] command = HexUtils.hexStringToShortArray(commandStr);
                    byte[] byteRead = new byte[0];
                    /**判断mid*/
                    if (this.hasMid == 0x00) {
                        //表示没有mid
                        byteRead = new byte[command.length + 5];
                        byteRead[0] = (byte) 0x3D;
                        byteRead[1] = (byte) 0x72;
                        byteRead[2] = (byte) 0x01;//0x00表示主动上报，0x01表示命令下发,0x02表示对主动上报的应答，0x03表示对命令的应答
                        byteRead[3] = (byte) 0x00;//hasMore：00表示没有 01表示有
                        byteRead[4] = (byte) this.hasMid;
                        /**后面是data数据*/
                        for (int i = 0, len = command.length; i < len; i++) {
                            byteRead[i + 5] = (byte) command[i];
                        }

                    } else if (this.hasMid == 0x01) {
                        //表示有mid
                        /**61,114,1,0,1,0,30,-18,-86,-69*/
                        byteRead = new byte[command.length + 7];
                        byteRead[0] = (byte) 0x3D;
                        byteRead[1] = (byte) 0x72;
                        byteRead[2] = (byte) 0x01;//0x00表示主动上报，0x01表示命令下发,0x02表示对主动上报的应答，0x03表示对命令的应答
                        byteRead[3] = (byte) 0x00;//hasMore：00表示没有 01表示有
                        byteRead[4] = (byte) this.hasMid;//是否有mid
                        byteRead[5] = (byte) ((this.mid >> 8) & 0xFF); //mid的高字节
                        byteRead[6] = (byte) (this.mid & 0xFF);//mid的低字节
                        /**后面是data数据*/
                        for (int i = 0, len = command.length; i < len; i++) {
                            byteRead[i + 7] = (byte) command[i];
                        }
                    }

                    return byteRead;
                }
            }

            /**
             * 平台收到设备的上报数据，根据需要编码ACK，对设备进行响应，如果此处返回null，表示不需要对设备响应。
             * */
            else if (this.msgType.equalsIgnoreCase("cloudRsp")) {
                byte[] ack = new byte[10];
                ack[0] = (byte) 0x3D;
                ack[1] = (byte) 0x72;
                ack[2] = (byte) 0x02;//0x00表示主动上报，0x01表示命令下发,0x02表示对主动上报的应答，0x03表示对命令的应答
                ack[3] = (byte) this.hasMore;
                ack[4] = 0x00;
                ack[5] = 0x00;
                ack[6] = 0x00;
                ack[7] = 0x00;
                ack[8] = 0x01;
                ack[9] = (byte) this.errcode;
                return ack;
            }
            return null;
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return null;
        }
    }

}
